bitkeeper revision 1.1236.1.160 (424a861f1fQwwCOgZWaGK3g0CTOOkw)
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 30 Mar 2005 10:57:35 +0000 (10:57 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 30 Mar 2005 10:57:35 +0000 (10:57 +0000)
Tidy up vm_assist handling.
Signed-off-by: Keir Fraser <keir@xensource.com>
19 files changed:
linux-2.4.29-xen-sparse/arch/xen/kernel/head.S
linux-2.4.29-xen-sparse/arch/xen/kernel/setup.c
linux-2.6.11-xen-sparse/arch/xen/i386/kernel/head.S
linux-2.6.11-xen-sparse/arch/xen/i386/kernel/setup.c
linux-2.6.11-xen-sparse/arch/xen/kernel/fixup.c
linux-2.6.11-xen-sparse/arch/xen/kernel/reboot.c
tools/libxc/xc_linux_build.c
tools/libxc/xc_vmx_build.c
xen/arch/x86/dom0_ops.c
xen/arch/x86/domain.c
xen/arch/x86/domain_build.c
xen/common/domain.c
xen/common/elf.c
xen/common/kernel.c
xen/include/asm-ia64/config.h
xen/include/asm-x86/mm.h
xen/include/public/arch-x86_32.h
xen/include/public/arch-x86_64.h
xen/include/xen/sched.h

index c856a0bd29fa00d4f2add5d3ba2d52410be15d52..e8c563572bc11bec494e4ce1c9ed5ec8b98be4fb 100644 (file)
@@ -2,7 +2,6 @@
 .section __xen_guest
     .ascii "GUEST_OS=linux,GUEST_VER=2.4,XEN_VER=3.0,VIRT_BASE=0xC0000000"
     .ascii ",LOADER=generic"
-    .ascii ",PT_MODE_WRITABLE"
     .byte  0
 
 .text
index 5d3529a80ae2bcf3a0fcdb65f0965a3f6d5a2770..8fcbf0d7200fa33f3c899aa9462e7f6e6ab1e7f6 100644 (file)
@@ -228,8 +228,10 @@ void __init setup_arch(char **cmdline_p)
     blk_nohighio = 1;
 #endif
 
-    HYPERVISOR_vm_assist(VMASST_CMD_enable,
-                         VMASST_TYPE_4gb_segments);
+    HYPERVISOR_vm_assist(
+        VMASST_CMD_enable, VMASST_TYPE_4gb_segments);
+    HYPERVISOR_vm_assist(
+        VMASST_CMD_enable, VMASST_TYPE_writable_pagetables);
         
     HYPERVISOR_set_callbacks(
         __KERNEL_CS, (unsigned long)hypervisor_callback,
index 8b998ea0030f69463809a25032868d1ac02d03b2..74b14017bff205add7ffa9229bbc0230fc8076db 100644 (file)
@@ -4,7 +4,6 @@
 .section __xen_guest
        .ascii  "GUEST_OS=linux,GUEST_VER=2.6,XEN_VER=3.0,VIRT_BASE=0xC0000000"
        .ascii  ",LOADER=generic"
-       .ascii  ",PT_MODE_WRITABLE"
        .byte   0
 
 .text
index 8cd00c343ef8992b2ee48b4a5144f0bad03e92e3..5723ed21c4e8da4d26ac38100c00707cacc1416e 100644 (file)
@@ -1409,8 +1409,10 @@ void __init setup_arch(char **cmdline_p)
        /* Register a call for panic conditions. */
        notifier_chain_register(&panic_notifier_list, &xen_panic_block);
 
-       HYPERVISOR_vm_assist(VMASST_CMD_enable,
-                            VMASST_TYPE_4gb_segments);
+       HYPERVISOR_vm_assist(
+               VMASST_CMD_enable, VMASST_TYPE_4gb_segments);
+       HYPERVISOR_vm_assist(
+               VMASST_CMD_enable, VMASST_TYPE_writable_pagetables);
 
        memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
        early_cpu_init();
index 01fe5df9425a326e9a3b672d0aa58bfea344c683..017f215cf88b321ac504873eae4db85c4ba01efa 100644 (file)
@@ -50,8 +50,8 @@ __LINKAGE void do_fixup_4gb_segment(struct pt_regs *regs, long error_code)
 
     if ( !test_and_set_bit(0, &printed) )
     {
-        HYPERVISOR_vm_assist(VMASST_CMD_disable,
-                             VMASST_TYPE_4gb_segments_notify);
+        HYPERVISOR_vm_assist(
+            VMASST_CMD_disable, VMASST_TYPE_4gb_segments_notify);
 
         DP("");
         DP("***************************************************************");
@@ -79,8 +79,8 @@ __LINKAGE void do_fixup_4gb_segment(struct pt_regs *regs, long error_code)
 
 static int __init fixup_init(void)
 {
-    HYPERVISOR_vm_assist(VMASST_CMD_enable,
-                         VMASST_TYPE_4gb_segments_notify);
+    HYPERVISOR_vm_assist(
+        VMASST_CMD_enable, VMASST_TYPE_4gb_segments_notify);
     return 0;
 }
 __initcall(fixup_init);
index 37c70d26da98e680853d5b43736e1318859a6548..f544ce4e9654918ddaf86441899f1d005f14badb 100644 (file)
@@ -110,18 +110,15 @@ static void __do_suspend(void)
     HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page;
     clear_fixmap(FIX_SHARED_INFO);
 
-    memcpy(&suspend_record->resume_info, &xen_start_info, sizeof(xen_start_info));
+    memcpy(&suspend_record->resume_info, &xen_start_info,
+           sizeof(xen_start_info));
 
     HYPERVISOR_suspend(virt_to_machine(suspend_record) >> PAGE_SHIFT);
 
-    HYPERVISOR_vm_assist(VMASST_CMD_enable,
-                        VMASST_TYPE_4gb_segments);
-    HYPERVISOR_vm_assist(VMASST_CMD_enable,
-                        VMASST_TYPE_writable_pagetables);
-
     shutting_down = -1; 
 
-    memcpy(&xen_start_info, &suspend_record->resume_info, sizeof(xen_start_info));
+    memcpy(&xen_start_info, &suspend_record->resume_info,
+           sizeof(xen_start_info));
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     set_fixmap_ma(FIX_SHARED_INFO, xen_start_info.shared_info);
index 919800c1083bc18ff4ebdc3e0d12e7ab09a01c49..5e3d474ab0d98564f89badd87fae0b378baeb62b 100644 (file)
@@ -22,7 +22,6 @@ struct domain_setup_info
     unsigned long v_kernend;
     unsigned long v_kernentry;
 
-    unsigned int use_writable_pagetables;
     unsigned int load_bsd_symtab;
 
     unsigned long symtab_addr;
@@ -88,10 +87,6 @@ static int setup_guest(int xc_handle,
     if ( rc != 0 )
         goto error_out;
 
-    if (dsi.use_writable_pagetables)
-        xc_domain_setvmassist(xc_handle, dom, VMASST_CMD_enable,
-                              VMASST_TYPE_writable_pagetables);
-
     if (dsi.load_bsd_symtab)
         loadelfsymtab(image, xc_handle, dom, NULL, &dsi);
 
@@ -580,9 +575,6 @@ static int parseelfimage(char *elfbase,
     if ( (p = strstr(guestinfo, "VIRT_BASE=")) != NULL )
         dsi->v_start = strtoul(p+10, &p, 0);
 
-    if ( (p = strstr(guestinfo, "PT_MODE_WRITABLE")) != NULL )
-        dsi->use_writable_pagetables = 1;
-
     if ( (p = strstr(guestinfo, "BSD_SYMTAB")) != NULL )
         dsi->load_bsd_symtab = 1;
 
index 8ef871c9c4d389046b513e267e884400e9439f0a..b1937b76baa86a4bef52ac9e4f63c3066f0aa2c5 100644 (file)
@@ -27,7 +27,6 @@ struct domain_setup_info
     unsigned long v_kernend;
     unsigned long v_kernentry;
 
-    unsigned int use_writable_pagetables;
     unsigned int load_bsd_symtab;
 
     unsigned long symtab_addr;
@@ -198,10 +197,6 @@ static int setup_guest(int xc_handle,
     if ( rc != 0 )
         goto error_out;
 
-    if (dsi.use_writable_pagetables)
-        xc_domain_setvmassist(xc_handle, dom, VMASST_CMD_enable,
-                              VMASST_TYPE_writable_pagetables);
-
     if (dsi.load_bsd_symtab)
         loadelfsymtab(image, xc_handle, dom, NULL, &dsi);
 
@@ -708,7 +703,6 @@ static int parseelfimage(char *elfbase,
     }
 
     dsi->v_start = 0x00000000;
-    dsi->use_writable_pagetables = 0;
     dsi->load_bsd_symtab = 0;
 
     dsi->v_kernstart = kernstart - LINUX_PAGE_OFFSET;
index 27074f1cc841c23e75e2b372fde3ff38e400cc2c..4cc72159bee359e4c4eee826b9c2acef352d812b 100644 (file)
@@ -435,8 +435,15 @@ void arch_getdomaininfo_ctxt(
     memcpy(c->debugreg, 
            ed->arch.debugreg, 
            sizeof(ed->arch.debugreg));
+#if defined(__i386__)
     c->event_callback_cs     = ed->arch.event_selector;
     c->event_callback_eip    = ed->arch.event_address;
     c->failsafe_callback_cs  = ed->arch.failsafe_selector;
     c->failsafe_callback_eip = ed->arch.failsafe_address;
+#elif defined(__x86_64__)
+    c->event_callback_eip    = ed->arch.event_address;
+    c->failsafe_callback_eip = ed->arch.failsafe_address;
+    c->syscall_callback_eip  = ed->arch.syscall_address;
+#endif
+    c->vm_assist = ed->domain->vm_assist;
 }
index e26a509f2af284dfc812411efb137a7e7fc23487..a53f4c09fb77edff231cafa4156c135e537b9939 100644 (file)
@@ -494,10 +494,19 @@ int arch_set_info_guest(
     for ( i = 0; i < 8; i++ )
         (void)set_debugreg(ed, i, c->debugreg[i]);
 
+#if defined(__i386__)
     ed->arch.event_selector    = c->event_callback_cs;
     ed->arch.event_address     = c->event_callback_eip;
     ed->arch.failsafe_selector = c->failsafe_callback_cs;
     ed->arch.failsafe_address  = c->failsafe_callback_eip;
+#elif defined(__x86_64__)
+    ed->arch.event_address     = c->event_callback_eip;
+    ed->arch.failsafe_address  = c->failsafe_callback_eip;
+    ed->arch.syscall_address   = c->syscall_callback_eip;
+#endif
+
+    if ( ed->eid == 0 )
+        d->vm_assist = c->vm_assist;
 
     phys_basetab = c->pt_base;
     ed->arch.guest_table = ed->arch.phys_table = mk_pagetable(phys_basetab);
index 3ad344ce09193d6a45af582f4f2ec01bc1e9164b..5e8c8a509a90eba71c229ecddb18d5db50459f6f 100644 (file)
@@ -129,10 +129,6 @@ int construct_dom0(struct domain *d,
     if ( rc != 0 )
         return rc;
 
-    /* Set up domain options */
-    if ( dsi.use_writable_pagetables )
-        vm_assist(d, VMASST_CMD_enable, VMASST_TYPE_writable_pagetables);
-
     /* Align load address to 4MB boundary. */
     dsi.v_start &= ~((1UL<<22)-1);
 
index 54b67cb95f53b103bf23a094e62c90382e3d7599..cc3c5bf917c24b1b443e872afc326bc58fa648cf 100644 (file)
@@ -358,13 +358,9 @@ long vm_assist(struct domain *p, unsigned int cmd, unsigned int type)
     {
     case VMASST_CMD_enable:
         set_bit(type, &p->vm_assist);
-        if (vm_assist_info[type].enable)
-            (*vm_assist_info[type].enable)(p);
         return 0;
     case VMASST_CMD_disable:
         clear_bit(type, &p->vm_assist);
-        if (vm_assist_info[type].disable)
-            (*vm_assist_info[type].disable)(p);
         return 0;
     }
 
index 74f1609392ff7671d688981fb1fd4138b66055e7..3ee170b453f9ac086f5be72bdff8d181886c9c2b 100644 (file)
@@ -118,9 +118,6 @@ int parseelfimage(char *elfbase,
     {
         if ( (p = strstr(guestinfo, "VIRT_BASE=")) != NULL )
             dsi->v_start = simple_strtoul(p+10, &p, 0);
-        
-        if ( (p = strstr(guestinfo, "PT_MODE_WRITABLE")) != NULL )
-            dsi->use_writable_pagetables = 1;
     }
 
     dsi->v_kernstart = kernstart;
index c6e7c213d8cafdc6b0b60135ee2d5a8328ddf09c..e27a10a76b3130a85ab8a46d52974b6b529b6a59 100644 (file)
@@ -75,7 +75,6 @@ long do_xen_version(int cmd)
     return (XEN_VERSION<<16) | (XEN_SUBVERSION);
 }
 
-vm_assist_info_t vm_assist_info[MAX_VMASST_TYPE + 1];
 long do_vm_assist(unsigned int cmd, unsigned int type)
 {
     return vm_assist(current->domain, cmd, type);
index c2b831a978599bee85be6555547c0b7b5155a7d1..3d4dfec45e286ec5290cd390f23c9c08c8179347 100644 (file)
@@ -51,13 +51,6 @@ extern unsigned long xenheap_size;
 // from linux/include/linux/mm.h
 extern struct page *mem_map;
 
-// defined in include/asm-x86/mm.h, not really used for ia64
-typedef struct {
-    void       (*enable)(struct domain *p);
-    void       (*disable)(struct domain *p);
-} vm_assist_info_t;
-extern vm_assist_info_t vm_assist_info[];
-
 // xen/include/asm/config.h
 extern char _end[]; /* standard ELF symbol */
 
index 17357bbcb4cc7116d131c33bd304c96cb22e56ef..2831138fb0ccbb7ea1a6f90e59f2fd6772c57e5d 100644 (file)
@@ -246,14 +246,6 @@ void memguard_unguard_range(void *p, unsigned long l);
 #define memguard_unguard_range(_p,_l)  ((void)0)
 #endif
 
-
-typedef struct {
-    void       (*enable)(struct domain *);
-    void       (*disable)(struct domain *);
-} vm_assist_info_t;
-extern vm_assist_info_t vm_assist_info[];
-
-
 /* Writable Pagetables */
 typedef struct {
     /* Linear address where the guest is updating the p.t. page. */
index cc711b209c9d95c5218702088fb3f412bacd28af..1ca884f2fe18b315b674b6594eda09691a4ed237 100644 (file)
@@ -140,6 +140,7 @@ typedef struct {
     unsigned long event_callback_eip;
     unsigned long failsafe_callback_cs;     /* CS:EIP of failsafe callback  */
     unsigned long failsafe_callback_eip;
+    unsigned long vm_assist;                /* VMASST_TYPE_* bitmap */
 } PACKED full_execution_context_t;
 
 typedef struct {
index c00cba62ce4dadabce5d8aa0cd61b5b1a88c2e4f..2a6c44d4170c56dbbc62f1d54dc861886e44e958 100644 (file)
@@ -190,10 +190,10 @@ typedef struct {
     unsigned long kernel_ss, kernel_esp;  /* Virtual TSS (only SS1/ESP1)  */
     unsigned long pt_base;                  /* CR3 (pagetable base)         */
     unsigned long debugreg[8];              /* DB0-DB7 (debug registers)    */
-    unsigned long event_callback_cs;        /* CS:EIP of event callback     */
     unsigned long event_callback_eip;
-    unsigned long failsafe_callback_cs;     /* CS:EIP of failsafe callback  */
     unsigned long failsafe_callback_eip;
+    unsigned long syscall_callback_eip;
+    unsigned long vm_assist;                /* VMASST_TYPE_* bitmap */
 } PACKED full_execution_context_t;
 
 typedef struct {
index b28a955b0f5e5af0169ac79bc138346050deb154..c0567d8f28d3eb6192d8a7ec8cbf77214bf1ad48 100644 (file)
@@ -155,8 +155,6 @@ struct domain_setup_info
     unsigned long v_kernstart;
     unsigned long v_kernend;
     unsigned long v_kernentry;
-
-    unsigned int use_writable_pagetables;
 };
 
 #include <asm/uaccess.h> /* for KERNEL_DS */